-
Notifications
You must be signed in to change notification settings - Fork 47
Support for Verification of Payee #499
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
It seems like the HIVPP and HKVPA part is still missing. Is that because you simply made some progress so far and wanted to put it out there, or because the pieces that are in this PR so far already work end-to-end (i.e. we wouldn't need these other two segments to make banks accept transfers at least)?
|
||
$hkvpp = HKVPPv1::createEmpty(); | ||
|
||
# For now just pretend we support all formats |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does it mean if we pretend that we support all formats? Does the bank somehow get to choose one of them and then we have to be able to do something with it? Or is it not the library but instead the application (caller of phpFinTS) that would need to understand this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't gotten that far, as I have no way to test this. My guess is that the bank will chose one format from that list.
Our banks don't have any support for VoP yet, so i started implementing this without being able to test it. Maybe someone with a VoP ready bank can use it to help development. Also I wanted to get feedback early on, as I am still in the process of understanding VoP and how phpFinTS should implement it. |
@Philipp91 Ich hab jetzt ein Problem mit deinem Parser phpFinTS/lib/Fhp/Segment/VPP/ParameterNamensabgleichPruefauftrag.php Lines 22 to 23 in eb781da
In der Spezifikation steht bei 'VOP-pflichtiger Zahlungsverkehrsauftrag' Anzahl 'n', wie lässt sich das abbilden?
|
Das ging mir genauso. Ich habe den Code nach |
Es gibt ein neuen Zwischenstand, aber Ich hab jetzt folgendes Problem: Bei der Prüfung auf einen erwarteten Rückmeldungscode if ($response->findRueckmeldung(Rueckmeldungscode::FREIGABE_KANN_NICHT_ERTEILT_WERDEN) !== null) { wird der Code (3945) nicht gefunden obwohl er in der Antwort der Bank enthalten ist:
Edit: |
Laut FinTS_3.0_Formals_2017-10-06_final_version.pdf PDF-Seite 19 bedeutet Status=M Anzahl=n effektiv "einmal oder mehr". Es steht nicht explizit in der Spezifikation, aber es ergibt sich aus dem serialisierten Datenformat (das der Parser lesen können muss), dass es nach einem solchen "einmal oder mehr" Feld keine weiteren Felder geben darf. Weil sonst wüsste man nicht, welche Felder noch zu dem "einmal oder mehr" gehören und welches Feld dann das darauffolgende ist. Denn in der serialisierten Form sind die Felder nicht (wie bei JSON) benannt oder (wie bei Protocol Buffers) nummeriert. Sondern die Werte für die Felder tauchen einfach einer nach dem anderen auf und man muss (anhand der Spezifikation) wissen, welches welches ist. Die bisherige Implementierung des Parsers ist in der Hinsicht defensiv, d.h. solche "einmal oder mehr" Felder werden gar nicht erlaubt, weil sie bislang offenbar schlicht nicht vorkamen. Das kann aber geändert werden. Ich denke, wir sollten eine neue Annotation |
Es scheint nicht die
Und es wird nicht explizit HKTAN weggefiltert, sondern es werden nur diejenigen Rückmeldungen an die Action weitergeleitet, die sich auf Segmente beziehen, die von der Action an den Server geschickt wurden. Das macht eigentlich schon Sinn, oder? Blöde Frage: Ist Wenn ich das richtig sehe, hast du im aktuellen PR mit SendSEPATransferVoP einen Fork von SendSEPATransfer erstellt, der auch VoP unterstützt. Damit ist die VoP-Implementierung spezifisch für SendSEPATransferVoP. Spiegelt das die Idee von VoP in der Spezifikation wider (also ist VoP nur für SEPA-Transfers gedacht) oder ist es eher eine übergreifende Funktion? Selbst SendSEPATransfer an sich ist ja nicht ein einzelner Geschäftsvorfall, sondern verwendet intern CME, CSE, CCM und CCS. Ich gehe davon aus, dass VoP mindestens alle davon betrifft. Die Frage ist, ob es in Zukunft auch noch Anwendungen von VoP geben könnte, die nicht unter SendSEPATransfer fallen würden. Die VoP-Spezifikation nennt die Namen CME, CSE, CCM und CCS fast gar nicht, nur an zwei Stellen jeweils einen davon als Beispiel. Also scheint die Spezifikation allgemeiner zu sein. Ein Alternatives Design wäre, VoP nicht als Subklasse zu implementieren, sondern SendSEPATransfer an sich weiter zu verwenden und stattdessen in der FinTs-Klasse an sich das ganze VoP-Handling zu integrieren. Das kann natürlich neue Helfer-Funktionen wie |
Danke für die Erläuterung. Klingt soweit gut. Ich habe jetzt vorläufig |
Ja diese Meldung ist kein "Fehler" sondern ein Hinweis, dass man die HKVPA Bestätigung senden soll.
HIVPPS sagt akuell,
Das spricht eher für die Behandlung direkt von der Basisklasse. Ich würde es jetzt erstmal in die Richtung mit der Action weitermachen. Dann kann es die Grundlage für Weiteres sein. Ich will es zumindest einmal eine Überweisung mit VoP durchgeführt haben um den ganzen Prozess zu verstehen. |
Als temporären Workaround kannst du natürlich den |
Mit dem aktuellen Versionsstand funktioniert es. Für mich sind jetzt noch offene Fragen, inwieweit FinTs das Prüfergebnis parsen und betrachten soll. Insbesondere bei Sammelüberweisungen muss das eigentlich die Anwendung machen, also prüfen welche Überweisung welchen Prüfstatus hat und die Wahl dem Endnutzer lassen. Da man auf FinTs Ebene letztlich nur sagt, "(trotzdem) ausführen", kann ja die Anwendung entscheiden ob das getan werden soll oder nicht. Wer also dringende Überweisungen mit FinTs zu tätigen hat, kann diesen PR gerne testen und Feedback geben. Die Funktionalität in die FinTs Klasse zu überführen kann ich nächste Woche angehen. Alternativ kann das auch jemand anders machen 😏 |
Ah das ist ja interessant. Das heißt, mithilfe der BPD kann die zentrale FinTs-Klasse einfach anhand der Request-Segmente, die die Action produziert hat, erkennen, dass VoP nötig ist. Das muss die Action gar nicht selber wissen/deklarieren.
Ich kann es mir gerne mal anschauen. Dazu muss ich natürlich erst verstehen, wie die bisherige Implementierung hier funktioniert. Ich stelle dann mal ein paar Fragen. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich habe den Code mal grob durchgelesen und versucht zu verstehen, wie die VoP-Sequenz funktioniert. Dabei habe ich ein paar Kommentare produziert, die nicht unbedingt alle beantwortet werden müssen (teilweise einfach kleine Details um den Code schöner zu machen, oder dieselben Fragen in verschiedenen Varianten).
Es wäre super, wenn du mir durch gezielte Beantwortung der aus deiner Sicht relevantesten Fragen helfen könntest, den Vorgang besser zu verstehen.
Und du hast ja geschrieben, dass es schon funktioniert. Das einzige was noch fehlt, wäre, dass man das Prüfergebnis irgendwie verarbeitet und Richtung Nutzer schickt, und dass der Code ein bisschen verschönert und idealerweise in die FinTs-Klasse gezogen wird. Das bedeutet aber auch, dass die exakten Daten, die über die Leitung gehen, sich nicht mehr ändern werden. Im Gegenteil: Wenn wir jetzt anhang von einer (anonymisierten) "Aufnahme" von Requests/Responses, die du von einer erfolgreichen Überweisung machst, einen Unit-Test bauen könnten, der das Ganze automatisiert wieder abspielen kann ohne echte Bank, dann könnte man viel mutiger Refactorings angehen, weil der Unit-Test ja deren Korrektheit beweisen würde.
if (($needTanForSegment = $action->getNeedTanForSegment()) !== null) { | ||
$message->add(HKTANFactory::createProzessvariante2Step1( | ||
$this->requireTanMode(), $this->selectedTanMedium, $needTanForSegment)); | ||
$hktan = HKTANFactory::createProzessvariante2Step1($this->requireTanMode(), $this->selectedTanMedium, $needTanForSegment); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Diese Code-Änderung hat keine Auswirkung, oder? Könnte man also auch rückgängig machen.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doch, ich brauche die Variable um die Segmentnummer zu ermitteln, damit es nicht rausgefiltert wird. Da ist aber nur relevant wenn die Action selbst die VoP sachen macht.
return; | ||
} | ||
|
||
if (($pagination = $response->findRueckmeldung(Rueckmeldungscode::PAGINATION)) !== null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Das ist code 3040. In der VoP-Spezifikation kommt der nicht so explizit vor. Ergibt sich das daraus, dass dort von "Aufsetzpunktmechanismus" die Rede ist? Oder hast du die 3040 einfach in der freien Wildbahn beobachtet?
Der Begriff "Pagination" passt dann nicht mehr so richtig. Wenn das wirklich identisch ist mit dem Aufsetzpunkt der für Pagination verwendet wird, sollten wir es in "continuation (token)" oder so umbenennen.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich habe lange nicht verstanden wo der Aufsetzpunkt herkommen soll, der in der Spezifikation erwähnt wird. Bis ich dann draufgekommen bin das es Aufsetzpunkte ja schon öfter gab. Und ja: ohne den Aufsetzpunkt funktioniert das Polling der Ergebnisse nicht.
public ?HKVPPv1 $hkvpp = null; | ||
public ?HIVPPv1 $hivpp = null; | ||
|
||
protected function createRequest(BPD $bpd, ?UPD $upd) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Für mein besseres Verständnis: Diese Funktion wird ja nun vermutlich einige Male nacheinander aufgerufen. Anhand des Zustands der obigen Member-Variablen muss die Action dann entscheiden können, welche Requests jeweils gesendet werden sollen.
Könntest du mir bitte einen Überblick geben, was der Reihe nach passiert? Vielleicht in Form einer Chronologie, welche von den if
s unten nacheinander zutreffen? Oder in Form eines Logs von Requests und Responses? Oder als Beschreibung der Zustands-Änderungen (also wann geht vopNeedsConfirmation auf true, wann auf false, wann relativ dazu geht vopIsPending auf true und so weiter)? Ich weiß nicht, in welcher Form es sich am besten erklären lässt. (Im Idealfall kann man eine einfachst-mögliche Erklärung am Ende auch in einfachen Code gießen.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Der Ablauf ist in der Spezifikation bereits als Diagram dargestellt. Grob gesagt:
- Prüfauftrag (HKVPP) + Geschäftsvorfall abschicken
- Bank antwortet mit, keine Prüfautrag nötig oder mit HIVPP (der dann entweder das Prüfergebnis + VoP-Id enthält oder eine Polling-Id und keine VoP-Id).
- Abhängig davon muss ggf. solange HKVPP (Polling-Id + Aufsetzpunkt) nochmal schicken abfragen bis man eine VoP-Id ()bekommen hat.
- Wenn man endlich eine VoP-Id hat, dann kann man den Ausführungsauftrag (HKVPA) + den ursprünglichen Geschäftsvorfall abschicken.
- Dann kommt die normale Tan-Behandlung
$requestSegment = parent::createRequest($bpd, $upd); | ||
$requestSegments = [$requestSegment]; | ||
|
||
if ($this->vopNeedsConfirmation && $this->vopConfirmed) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hier fehlt mir ein erklärender Kommentar.
return $this->vopIsPending; | ||
} | ||
|
||
public function needsConfirmation() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needsConfirmation()
ist, wenn der Endnutzer etwas tun muss (z.b. 2FA bestätigen auf dem Handy). Das scheint hier nicht der Fall zu sein, oder? (Sonst würde ich eine neue Methode FinTs::confirmVoP()
erwarten analog zu submitTan()
.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah jetzt sehe ich deinen Beispielcode. Also braucht es doch beides und statt FinTs::confirmVoP()
haben wir im Moment Action::setConfirmed()
(was für mich wie ein dummer Setter klang, aber was wohl eine Funktion mit mehr Tragweite ist).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needsConfirmation
ist wenn die Bank einen HKVPA verlangt. Das ist also außer in bestimmten Sonderfällen eigentlich immer der Fall.
Dann muss der Nutzer ja irgendwie mitteilen, dass er diese Bestätigung auch erteilt. Das hatte ich setConfirmed
genannt. Beides muss True sein bevor man einen Ausführungsauftrag sendet. FinTs::confirmVoP()
ist aber in der Tat viel klarer.
In deinem Beispielcode wird |
Ah, also bevor Welche Informationen stellt uns die Bank denn zur Verfügung, die man dem Nutzer hier anzeigen könnte? |
Gute Frage, da die Bank (theoretisch) den Auftrag auch gleich annehmen kann ohne HKVPA, kann an der Stelle schon die Tan Challenge kommen. Es wäre in dem Falle aber
Exakt.
Die Bank liefert einen pain.002.001.10 XML Customer Report, dort ist für jede einzelne Überweisung das Ergebnis der Prüfung drin und auch ein Gesamtwert. Dann gibt es noch
Ich kann dir entweder die Logs schicken oder es nächste Woche anvisieren den gewünschten Test zu schreiben. Ich kann auch anbieten nächste Woche einen neuen PR zu machen, der nur die neuen Segmente und Rückmeldungscodes enthält, aber keine weitere Logik. |
Für
Cool! Wie du möchtest.
Auch das wäre nützlich, dann könnte man mit Mergen anfangen. Aber den hier unbedingt bestehen lassen, denn die weitere Logik wird ja schon benötigt (nur in anderer Form) und hier kann man sie schon anschauen. Ich denke, so kommen wir gut vorwärts. Nur falls es irgendwo hakt, könnte ich auch von der anderen Seite anfangen (habe ich heute überlegt, bin dann aber nicht dazu gekommen): Wenn du möchtest, könnte ich in FinTs ein paar neue API-Funktionen mit Dokumentation schreiben, sowie dein Beispiel aus dem Post oben in |
Ich hab jetzt einen Test geschrieben, der zweimal VoP durchläuft. Einmal mit Prüfergebnis "No Match" und einmal mit "Match". @Philipp91 Kannnst/möchtest du mit diesem Test die Implementation machen? |
Ich habe gerade den aktuellen Stand getestet und stoße auf dieses Problem, ist das nach wie vor so oder kann ich irgendetwas tun? |
Der Code funktioniert bei mir. Für das konkrete Problem hatte ich einen Workaround eingebaut. Hast du wirklich den letzten Stand? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vielen Dank für den Test!
Ich gehe davon aus, dass er funktioniert, also dass composer test
keine Fehler wirft.
Kann diese Bibliothek dieses Format heute schon parsen? Oder wäre es ziemlich einfach, das zu implementieren? Oder ist es eher etwas, was man wie SEPA-XML an eine andere Bibliothek outsourcen würde? |
Ich habe folgenden Stand: commit 60a62ee (HEAD -> verification-of-payee, origin/verification-of-payee) Und wenn ich es richtig interpretiere, ist der Code in der Rückmeldung enthalten:
|
Am Mittwoch oder spätestens nächstes Wochenende sollte ich dazukommen. Wenn dir das zu langsam geht, kannst du gerne auch selber daran arbeiten. Was ich beim Rumschauen schon gesehen habe:
|
Das ist so. Soweit so normal. Die Frage ist, ob phpFinTS richtig damit umgehen kann. Was passiert denn bei dir als nächstes? |
Ich laufe in die Exception rein: https://github.com/ampaze/phpFinTS/blob/60a62eea2f775a3bd5a0f3dc2d25205a0a90e7b1/lib/Fhp/Action/SendSEPATransferVoP.php#L134 |
Korrekt. Das mit der while Schleife war eher zur Demonstration wieder Ablauf ist. |
Das können wir in |
Da der Test sowieso geändert werden muss (weil er auf SendTransferVoP beruht, was es ja dann nicht mehr geben wird), betrachte es eher als Zusatzinformation für dich 😄 |
Du könntest mal deine sonstigen Logs mit meinen aus dem |
FinTs kann das nicht parsen, das Format ist aber relativ einfaches XML. Zwei Beispiele sind in dem SendTransferVoPTest enthalten.
Sag doch bescheid ob du morgen daran arbeitest.
Das heißt du hast vor den
Hier würde ich glaube ich explizit |
Fange gerade an.
Ja genau, weil als "Zustand" gehört es zur Action. Es gibt auch Zustand, der zu Das hält uns aber nicht davon ab, die APIs inbesondere für das Auslösen von Aktionen wie "VoP bestätigen" oder so in FinTs zu packen. |
Dann sollte man es ja eigentlich |
$response->findRueckmeldung(Rueckmeldungscode::VOP_KEINE_NAMENSABWEICHUNG) !== null | ||
// The bank has discarded the request, and wants us to resend it with a HKVPA | ||
// This can happen even if the name matches. | ||
|| $response->findRueckmeldung(Rueckmeldungscode::FREIGABE_KANN_NICHT_ERTEILT_WERDEN) !== null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Es gibt drei alternative Bedingungen in diesem if
. Wenn wir hier in dieses if
reingehen, wird vopNeedsConfirmation = true
gesetzt. Das überrascht mich:
- Zur ersten Bedingung
VOP_KEINE_NAMENSABWEICHUNG
finde ich nicht viel in der Spezifikation, aber ich würde vermuten es bedeutet "ist auch ohne VOP okay", also wärevopNeedsConfirmation = false
angemessen. - Bei der zweiten Bedingung
FREIGABE_KANN_NICHT_ERTEILT_WERDEN
habe ich das Gefühl, dass es ein Nebenschauplatz ist. Wenn die Bank VOP machen will, dann dauert das erst Mal und am Ende ist eventuell eine Bestätigung nötig. Darum verwirft sie den aktuellen TAN-Request (denn wenn eine TAN-Challenge enthalten wäre, hätte die eventuell ein Timeout z.B. aus kryptographischen Gründen, das während der VOP-Prüfung ablaufen könnte). Wenn VOP dann durch ist, sollen wir laut Spezifikation einen frischen Anlauf mit der TAN starten. Wir könnten zwar den Abbruch des TAN-Requests als Signal interpretieren, dass VOP stattfindet aber es kommt mir ziemlich implizit vor. Ich hoffe, dass die erste Antwort der Bank (SEND_TRANSFER_RESPONSE
im Unit Test) noch hilfreichere Signale in die Richtung enthält.- Und selbst wenn wir erkennen, dass VOP stattfindet, sollten wir noch nicht
vopNeedsConfirmation
setzen, sondern nurvopIsPending
. Denn bis jetzt arbeitet die Bank ja nur an der Prüfung und es kann durchaus sein, dass sie nach der Verarbeitung noch zu dem Schluss kommt, dass keine Bestätigung durch den Nutzer mehr nötig ist.
- Und selbst wenn wir erkennen, dass VOP stattfindet, sollten wir noch nicht
VOP_ERGEBNIS_NAMENSABGLEICH_PRUEFEN
Das ist genau die Nachricht, wo ichvopNeedsConfirmation = true
setzen würde. Es heißt ja schon wörtlich fast gleich.
Also ist jetzt die Frage, wie man der SEND_TRANSFER_RESPONSE
ansieht, dass (1) VOP stattfindet und (2) man noch warten/pollen muss. Wir haben diese Segmente darin:
HIRMS:4:2:3+3040::Es liegen weitere Informationen vor.:staticscrollref'
=>PAGINATION
aka Aufsetzpunkt.- Dieses Segment wird ein paar Zeilen weiter oben erkannt und
paginationToken
daraus befüllt (sonst nichts). - Ich habe den Eindruck, dass das das Signal ist, nach dem wir suchen. Klingt das plausibel? Die Idee ist, dass der Client immer gleich auf einen Aufsetzpunkt reagiert: Das betroffene Segment nochmal einreichen und die Antworten aneinanderhängen, so lange bis der Aufsetzpunkt verschwindet -- denn dann hat man das Ende ("die letzte Seite") erreicht.
- Dieses Segment wird ein paar Zeilen weiter oben erkannt und
HIVPP:6:1:3+++@36@c0f5c2a4-ebb7-4e72-be44-c68742177a2b+++++2'
Hier ist daspollingId
-Feld belegt. Wenn das so ist, müssen wir sie beim Polling zurückliefern. Aber wenn sie nicht belegt wäre, würde Polling trotzdem stattfinden, einfach nur mit dem Aufsetzpunkt allein.
Ich gehe mal davon aus, dass meine Vermutung richtig ist, und implementiere es in FinTs
allein aufgrund vom Aufsetzpunkt. Hoffentlich funktioniert es dann trotzdem mit deinem Unit-Test zusammen, ohne dass dieser geändert werden muss.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-
Habe auch wenig zu
VOP_KEINE_NAMENSABWEICHUNG
gefunden, aber Bank (bzw. Atruvia) verlangt soweit ich es ausprobiert habe auch bei Namensgleichheit, dass man die Ausführungsauftrag sendet. Ich denke die haben versucht den Prozess einheitlich zu gestalten, sodass der Ablauf immer gleich ist, egal wie das Ergebnis der Prüfung ist. -
FREIGABE_KANN_NICHT_ERTEILT_WERDEN
wird zumindest von Atruvia auch bei Namensgleichheit geschickt, das hab ich gerade noch mal in den Logs nachgeguckt. Es ist also ein Ausführungsauftrag erforderlich.
In der Spezifikation steht explizit dass alleine die Rückmeldungscode ausschlaggebend sind, nicht die sonstigen Segmente. So hab ich das auch implementiert. Zitat:
Der Ablauf wird grundsätzlich nur durch die Rückmeldungscodes gesteuert und nicht durch das Prüfergebnis im HIVPP.
Es kann also vorkommen, dass der Rückmeldungscode 3945 "Freigabe kann nicht erteilt werden" auch bei einem VOP-Prüfergebnis RCVC (Match) gesendet wird. Dies gilt insbesondere für das Polling oder aber bei Opt-Out mit Decoupled-Verfahren. Das Kundenprodukt hat dann den Ablauf analog zum Close-/No-Match/Not Applicable-Ablauf (d.h. Neueinreichung des ZV-Auftrags und HKTAN in Verbindung mit HKVPA) fortzusetzen (s. Punkt 4. und Ablaufdiagramme_E.8.1.1.2 bzw._E.8.1.2.2 und_E.8.1.2.4..
Implementierungsbedingt kann es vorkommen, dass auch im Match-Fall einen Rückmeldungscode 3090 gesendet wird.
Implementierungsbedingt kann es vorkommen, dass ein Institut auch bei einem Match-Ergebnis immer mit einem Rückmeldungscode 3945 „Freigabe kann nicht erteilt werden" antwortet und grundsätzlich eine erneute Einreichung des ZV-Auftrags und HKTAN in Verbindung mit HKVPA erwartet.
Hast du mal ausprobiert / weißt du, ob man nach (Die Spezifikation erwähnt mehrere Dialoge nur im Rahmen der Mehrfachsignatur.) |
Nein hab ich noch nicht, kann ich mit deiner Implementierung dann gerne testen. |
I hope this PR can spark a discussion on how to implement VoP.
Using this code I have successfully send SEPA Transfers with VoP, I tested Full Match, Partial Match and No match.
I would consider this code a Proof of Concept, the next step would be to integrate it in the FinTs class and not inside the action.
Usage with the current version is
refs #477